home *** CD-ROM | disk | FTP | other *** search
- /* Support for dynamic loading of extension modules */
-
- #include <windows.h>
- #include <direct.h>
-
- #include "Python.h"
- #include "importdl.h"
-
- const struct filedescr _PyImport_DynLoadFiletab[] = {
- #ifdef _DEBUG
- {"_d.pyd", "rb", C_EXTENSION},
- {"_d.dll", "rb", C_EXTENSION},
- #else
- {".pyd", "rb", C_EXTENSION},
- {".dll", "rb", C_EXTENSION},
- #endif
- {0, 0}
- };
-
-
- dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
- const char *pathname, FILE *fp)
- {
- dl_funcptr p;
- char funcname[258];
-
- sprintf(funcname, "init%.200s", shortname);
-
- #ifdef MS_WIN32
- {
- HINSTANCE hDLL;
- char pathbuf[260];
- if (strchr(pathname, '\\') == NULL &&
- strchr(pathname, '/') == NULL)
- {
- /* Prefix bare filename with ".\" */
- char *p = pathbuf;
- *p = '\0';
- _getcwd(pathbuf, sizeof pathbuf);
- if (*p != '\0' && p[1] == ':')
- p += 2;
- sprintf(p, ".\\%-.255s", pathname);
- pathname = pathbuf;
- }
- /* Look for dependent DLLs in directory of pathname first */
- /* XXX This call doesn't exist in Windows CE */
- hDLL = LoadLibraryEx(pathname, NULL,
- LOAD_WITH_ALTERED_SEARCH_PATH);
- if (hDLL==NULL){
- char errBuf[256];
- unsigned int errorCode;
-
- /* Get an error string from Win32 error code */
- char theInfo[256]; /* Pointer to error text
- from system */
- int theLength; /* Length of error text */
-
- errorCode = GetLastError();
-
- theLength = FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM, /* flags */
- NULL, /* message source */
- errorCode, /* the message (error) ID */
- 0, /* default language environment */
- (LPTSTR) theInfo, /* the buffer */
- sizeof(theInfo), /* the buffer size */
- NULL); /* no additional format args. */
-
- /* Problem: could not get the error message.
- This should not happen if called correctly. */
- if (theLength == 0) {
- sprintf(errBuf,
- "DLL load failed with error code %d",
- errorCode);
- } else {
- int len;
- /* For some reason a \r\n
- is appended to the text */
- if (theLength >= 2 &&
- theInfo[theLength-2] == '\r' &&
- theInfo[theLength-1] == '\n') {
- theLength -= 2;
- theInfo[theLength] = '\0';
- }
- strcpy(errBuf, "DLL load failed: ");
- len = strlen(errBuf);
- strncpy(errBuf+len, theInfo,
- sizeof(errBuf)-len);
- errBuf[sizeof(errBuf)-1] = '\0';
- }
- PyErr_SetString(PyExc_ImportError, errBuf);
- return NULL;
- }
- p = GetProcAddress(hDLL, funcname);
- }
- #endif /* MS_WIN32 */
- #ifdef MS_WIN16
- {
- HINSTANCE hDLL;
- char pathbuf[16];
- if (strchr(pathname, '\\') == NULL &&
- strchr(pathname, '/') == NULL)
- {
- /* Prefix bare filename with ".\" */
- sprintf(pathbuf, ".\\%-.13s", pathname);
- pathname = pathbuf;
- }
- hDLL = LoadLibrary(pathname);
- if (hDLL < HINSTANCE_ERROR){
- char errBuf[256];
- sprintf(errBuf,
- "DLL load failed with error code %d", hDLL);
- PyErr_SetString(PyExc_ImportError, errBuf);
- return NULL;
- }
- p = GetProcAddress(hDLL, funcname);
- }
- #endif /* MS_WIN16 */
-
- return p;
- }
-